package com.lifeverse.mapper;

import com.lifeverse.dto.LifeEntityCreateDTO;
import com.lifeverse.dto.LifeEntityDTO;
import com.lifeverse.dto.LifeEntityUpdateDTO;
import com.lifeverse.entity.LifeEntity;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 生命体实体与DTO转换器
 */
@Component
public class LifeEntityMapper {

    /**
     * Entity转DTO
     */
    public LifeEntityDTO toDTO(LifeEntity entity) {
        if (entity == null) {
            return null;
        }

        LifeEntityDTO dto = new LifeEntityDTO();
        dto.setId(entity.getId());
        dto.setName(entity.getName());
        dto.setType(entity.getType());
        dto.setStatus(entity.getStatus());
        dto.setConsciousnessLevel(entity.getConsciousnessLevel());
        dto.setDescription(entity.getDescription());
        dto.setEnergyLevel(entity.getEnergyLevel());
        dto.setHealthScore(entity.getHealthScore());
        dto.setWisdomScore(entity.getWisdomScore());
        dto.setCreativityScore(entity.getCreativityScore());
        dto.setCollaborationScore(entity.getCollaborationScore());
        dto.setLastActiveAt(entity.getLastActiveAt());
        dto.setBirthTime(entity.getBirthTime());
        dto.setEvolutionCount(entity.getEvolutionCount());
        dto.setLastEvolutionAt(entity.getLastEvolutionAt());
        dto.setParentId(entity.getParentId());
        dto.setCreatedAt(entity.getCreatedAt());
        dto.setUpdatedAt(entity.getUpdatedAt());
        dto.setAgeInDays(entity.getAgeInDays());
        dto.setAgeInHours(entity.getAgeInHours());
        dto.setIsActive(entity.isActive());
        dto.setIsOperational(entity.isOperational());

        return dto;
    }

    /**
     * Entity列表转DTO列表
     */
    public List<LifeEntityDTO> toDTOList(List<LifeEntity> entities) {
        if (entities == null) {
            return null;
        }
        return entities.stream()
                .map(this::toDTO)
                .collect(Collectors.toList());
    }

    /**
     * CreateDTO转Entity
     */
    public LifeEntity toEntity(LifeEntityCreateDTO createDTO) {
        if (createDTO == null) {
            return null;
        }

        LifeEntity entity = new LifeEntity();
        entity.setName(createDTO.getName());
        entity.setType(createDTO.getType());
        entity.setDescription(createDTO.getDescription());
        entity.setParentId(createDTO.getParentId());
        entity.setConfiguration(createDTO.getConfiguration());
        entity.setMetadata(createDTO.getMetadata());

        return entity;
    }

    /**
     * UpdateDTO转Entity（用于更新）
     */
    public LifeEntity toEntity(LifeEntityUpdateDTO updateDTO) {
        if (updateDTO == null) {
            return null;
        }

        LifeEntity entity = new LifeEntity();
        entity.setName(updateDTO.getName());
        entity.setType(updateDTO.getType());
        entity.setStatus(updateDTO.getStatus());
        entity.setConsciousnessLevel(updateDTO.getConsciousnessLevel());
        entity.setDescription(updateDTO.getDescription());
        entity.setConfiguration(updateDTO.getConfiguration());
        entity.setMetadata(updateDTO.getMetadata());

        return entity;
    }

    /**
     * 将UpdateDTO的非空字段更新到现有Entity
     */
    public void updateEntityFromDTO(LifeEntity entity, LifeEntityUpdateDTO updateDTO) {
        if (entity == null || updateDTO == null) {
            return;
        }

        if (updateDTO.getName() != null) {
            entity.setName(updateDTO.getName());
        }
        if (updateDTO.getType() != null) {
            entity.setType(updateDTO.getType());
        }
        if (updateDTO.getStatus() != null) {
            entity.setStatus(updateDTO.getStatus());
        }
        if (updateDTO.getConsciousnessLevel() != null) {
            entity.setConsciousnessLevel(updateDTO.getConsciousnessLevel());
        }
        if (updateDTO.getDescription() != null) {
            entity.setDescription(updateDTO.getDescription());
        }
        if (updateDTO.getConfiguration() != null) {
            entity.setConfiguration(updateDTO.getConfiguration());
        }
        if (updateDTO.getMetadata() != null) {
            entity.setMetadata(updateDTO.getMetadata());
        }
    }
}